home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Code Resources / Eclectic CDEFs / Celsius CDEF Folder / Celsius CDEF Info next >
Text File  |  1997-03-06  |  10KB  |  230 lines

  1. Celsius CDEF v 1.0
  2. ==================
  3. Copyright © Sebastiano Pilla 1996
  4. All rights reserved
  5. Original C source code Copyright © by Chris Larson, Andrew Regan
  6.  
  7.  
  8.  
  9. General Information
  10. -------------------
  11. This CDEF implements a progress bar similar to that used by the Finder and many other programs.
  12. Additionally, by setting the appropriate variation code, instead of the standard progress bar you get the 'barber pole' animation effect.
  13.  
  14. Other options, set with the appropriated variation codes, include honoring the colors specified in a 'cctb' resource, drawing the control always in the active state ignoring deactivations, and drawing an 'inset' effect around the control as outlined in the develop 15 article "Working in the Third Dimension".
  15.  
  16.  
  17. Contents of the Celsius CDEF Folder
  18. -----------------------------------
  19. - CalculateBarBoundary Folder: Symantec C project file, with accompanying C and 68000 Assembly code, and Pascal interface file to the CalculateBarBoundary.Lib library, used by the CelsiusCDEF project
  20. - Celsius CDEF Info: the documentation file you are reading now
  21. - CelsiusCDEF.p: Pascal source code for the Celsius control definition function
  22. - CelsiusCDEF.rsrc: compiled code for any 68K microprocessor of the Celsius control definition function
  23. - CelsiusCDEF.π: THINK Pascal project for compiling the CelsiusCDEF resource
  24. - CelsiusCDEF68020.rsrc: compiled code for 68020-68030-68040 microprocessors of the Celsius control definition function
  25. - CelsiusCDEFStub.p: Pascal source code of the Celsius control definition function, disguised to use any of the provided debugging stubs
  26.  
  27.  
  28. How to create a Celsius control
  29. -------------------------------
  30. The file 'Celsius CDEF.rsrc' contains the compiled code of the definition procedure as a resource of type 'CDEF' with ID of 130.
  31.  
  32. To incorporate the Celsius CDEF in your applications, just open the 'Celsius CDEF.rsrc' file with ResEdit (or any other suitable resource editor), copy the CDEF resource and paste it into your application's resource file.
  33.  
  34. For creating a progress bar control:
  35.  
  36. in the resource file of your project create a 'CNTL' resource and put into its ProcID field the number
  37.  
  38.         (130 * 16) + variation code
  39.         
  40. then in your program call
  41.  
  42.         progressBarHdl := GetNewControl(kProgressBarID, myWindow)
  43.  
  44. where kProgressBarID is the ID of the 'CNTL' resource and myWindow is a pointer to one of your windows.
  45. All the other fields in the 'CNTL' template work as usual, except for the control's title, which is always ignored by the definition procedure.
  46.  
  47. You can also call the NewControl trap, passing it basically the same parameters you enter in the 'CNTL' resource template.
  48.  
  49.  
  50. Variation Codes
  51. ---------------
  52. A number of possible variation codes can be added to the procID field to obtain special effects. These variation codes are:
  53.  
  54.     0: draw the standard done-to do progress bar
  55.     1: draw the barber pole animation (indefinite progress bar)
  56.     2: draw using the standard dark gray/steel blue colors, ignoring the colors defined in
  57.        any 'cctb' resource
  58.     4: draw always the control in the active (enabled) state
  59.     8: draw a 3D-like border around the control to obtain an inset effect
  60.  
  61. You can use any sum of these variation codes, to obtain combinations of the effects described.
  62. See the enclosed demo program for a comparison of all the 16 possible variants.
  63.  
  64. For example, a Finder-like progress bar would have procID := (130*16) + 2 + 4 = 2086, because is drawn in the standard dark gray / steel blue colors and doesn't get dimmed when its window is put into the background.
  65.  
  66.  
  67. How to use a Celsius control
  68. ----------------------------
  69. 1) Progress bar variation
  70.  
  71.    Let's assume that you're going to perform an operation on some range of items (for example,
  72.    copying some user-selected files between two folders). In this case you know how many steps
  73.    your operation will take, so you display a window with a Celsius progress bar.
  74.    After setting up the control's minimum and maximum to the lower and upper bound of your
  75.    range, respectively, simply run the control's value from the lower bound to the upper bound
  76.    of the range.
  77.    
  78.    Here's the pseudo-code:
  79.    
  80.    in Pascal
  81.    +++++++++
  82.    
  83.    VAR
  84.        progressBarHdl: ControlHandle;        { obtained via GetNewControl or NewControl }
  85.        itemCount, i: SInt16;
  86.    
  87.    BEGIN
  88.        { Set itemCount to the number of items you're going to handle }
  89.        
  90.        SetControlMinimum(progressBarHdl, 1);
  91.        SetControlMaximum(progressBarHdl, itemCount);
  92.        FOR i := 1 TO itemCount DO BEGIN
  93.            SetControlValue(progressBarHdl, i);
  94.            DoYourOperation(...);
  95.        END;
  96.    END;
  97.    
  98.    in C
  99.    ++++
  100.    
  101.    ControlHandle    progressBarHdl;        // obtained via GetNewControl or NewControl
  102.    SInt16            itemCount, i;
  103.    
  104.    // Set itemCount to the number of items you're going to handle
  105.    
  106.    SetControlMinimum(progressBarHdl, 1);
  107.    SetControlMaximum(progressBarHdl, itemCount);
  108.    for(i = 1 ; i <= itemCount ;i++ )
  109.    {
  110.            SetControlValue(progressBarHdl, i);
  111.            DoYourOperation(...);
  112.    }
  113.    
  114.    
  115.    
  116. 2) Barber pole variation
  117.  
  118.    Let's assume that you're going to perform a 'Find All' to search all the occurrences of a
  119.    string into a 1.5 MB text document. Obviously you don't know how much time this search will
  120.    take, so you display a window with a Celsius barber pole bar. In this case, the frame for
  121.    the barber pole animation is taken from the control's value, so all you have to do is keep
  122.    changing the control's value.
  123.    
  124.    Here's the pseudo-code:
  125.    
  126.    in Pascal
  127.    +++++++++
  128.    
  129.    VAR
  130.        barberPoleHdl: ControlHandle;        { obtained via GetNewControl or NewControl }
  131.        doneSearch: Boolean;
  132.    
  133.    BEGIN
  134.        SetControlValue(barberPoleHdl, 0);
  135.        
  136.        { Loop until the search is completed }
  137.        doneSearch := false;
  138.        WHILE NOT doneSearch DO BEGIN
  139.            doneSearch := SearchPartialDocument(...);
  140.            SetControlValue(barberPoleHdl, GetControlValue(barberPoleHdl) + 1);
  141.        END;
  142.    END;
  143.    
  144.    in C
  145.    ++++
  146.    
  147.    ControlHandle    barberPoleHdl;        // obtained via GetNewControl or NewControl
  148.    Boolean            doneSearch;
  149.    
  150.    SetControlValue(barberPoleHdl, 0);
  151.    
  152.    // Loop until the search is completed
  153.    doneSearch = false;
  154.    while (!doneSearch)
  155.    {
  156.            doneSearch = SearchPartialDocument(...);
  157.            SetControlValue(barberPoleHdl, GetControlValue(barberPoleHdl) + 1);
  158.        }
  159.  
  160. Note that going 'backwards' is supported in all the variations (though I can't imagine how someone would find a use for it)
  161.  
  162.  
  163. Part codes
  164. ----------
  165. The Celsius CDEF can only return 50 as part code to the TrackControl call.
  166.  
  167.  
  168. Color mapping of 'cctb' resources
  169. ---------------------------------
  170. When you add 2 to the procID field of the control template, the Celsius CDEF ignores any 'cctb' (control color table) resource that might be attached to the control. To have the Celsius CDEF honor your 'cctb' resource, be sure to NOT add 2 to the procID field. The Celsius CDEF maps the colors defined in your 'cctb' resource as follows:
  171.  
  172.     'cctb' part code            Celsius CDEF part
  173.     ================            =================
  174.     Frame color                    Frame color
  175.     Body color                    To Do part color
  176.     Text color                    Done part color
  177.     Thumb color                    Ignored
  178.  
  179.  
  180. Inset border
  181. ------------
  182. The border is drawn as specified in the 'Working in the third dimension' article in the issue 15 of the develop journal. The drawing procedure draws the inset effect only if the background color of the window owning the control is the ($EEEE, $EEEE, $EEEE) light gray color; no border is drawn if the window background color is different.
  183.  
  184.  
  185. Low memory conditions
  186. ---------------------
  187. When the Control Manager sends the initCntl message, the Celsius CDEF allocates a chunk of data and stores it into the contrlData field of the just created control.
  188.  
  189. First, if there's not enough memory to allocate that data, the contrlData field is set to NIL: in that case the drawing routine exits immediately, without drawing anything.
  190.  
  191. The offscreen graphics world is created at control's initialization and is kept in memory for the whole lifespan of the control: a progress-bar-like control has, typically, a short lifespan compared to the owning program, so keeping the offscreen world in memory should not cause many problems.
  192. Besides, for the consideration above, creating and destroying the offscreen world at each redraw would mean an unsustainable performance hit.
  193.  
  194. However, there may be times when the available memory is low, and the offscreen world cannot be created. In these situations the Celsius CDEF draws directly to the control's window, instead of using the offscreen world. Unfortunately, in this case you should expect to see minor 'flicker' effects when drawing; the 'flicker' effects are more evident if the control is drawn in the inactive state.
  195.  
  196.  
  197. What happens when...
  198. --------------------
  199. I have a Celsius control with the 3D inset effect and the window intersects a black-&-white screen?
  200.  
  201. The Celsius CDEF draws the 3D inset effect only on screens with depths of 256 colors or more. On a black-&-white screen the effect cannot be drawn, so we could use even the area of the border. To avoid floating the bar size, however, in the b&w case the outermost one-pixel rectangle is "wasted", i.e. painted with a white pattern.
  202.  
  203.  
  204. Compatibility Notes
  205. -------------------
  206. - Kaleidoscope control panel by Greg Landweber, Edward Voas and Amargosa Software
  207.   
  208.   Problem: This control panel (and the 'Aaron' extension) patches the drawing of progress bars
  209.   to display a modern, 3D-looking bar. This drawing overrides the Celsius CDEF, but the effect
  210.   is lost if the control is inactive: when the Celsius CDEF attempts to dither the progress bar,
  211.   it conflicts with the Kaleidoscope patch and creates a very unpleasant drawing, in which you
  212.   see only 2 rows of uniformly-spaced dots at the top and bottom of the bar.
  213.   
  214.   Solution: Add 4 as variation code to the procID field of the CNTL template, to always draw
  215.   the control in the active state.
  216.  
  217.  
  218. Future Directions
  219. -----------------
  220. - Vertical bars
  221. - I will deliberately *not* implement the Apple Grayscale Appearance in the Celsius CDEF. First, there are many other CDEFs and packages that provide it; second, if you really want it, you could implement it by yourself using the Celsius CDEF as a skeleton.
  222.  
  223.  
  224. Credits and inspirations
  225. ------------------------
  226. FinderProgressBar CDEF © by Chris Larson
  227. ProgressBar CDEF © by Andrew Regan
  228. Jim's CDEF © by Jim Stout
  229. Slider CDEF © by Harold Ekstrom
  230.